// #ifndef NLP_H
// #define NLP_H

// #include <math.h>

// typedef struct {
//     int n;          // 变量维度
//     int m;          // 不等式约束数
//     int p;          // 等式约束数
//     double (*f)(double *x); // 目标函数
//     void (*grad_f)(double *x, double *grad); // 目标函数梯度
//     void (*g)(double *x, double *result); // 不等式约束
//     void (*h)(double *x, double *result); // 等式约束
//     void (*jac_g)(double *x, double **jac); // 不等式约束雅可比
//     void (*jac_h)(double *x, double **jac); // 等式约束雅可比
// } NLPProblem;


// double objective(double *x);
// void gradient(double *x, double *grad);
// void inequality_constraints(double *x, double *result);
// void equality_constraints(double *x, double *result);
// void jacobian_ineq(double *x, double **jac);
// void jacobian_eq(double *x, double **jac);



// // double objective(double *x);
// // void gradient(double *x, double *grad);
// // void inequality_constraints(double *x, double *result);
// // void jacobian_ineq(double *x, double **jac);

// #endif


#ifndef NLP_H
#define NLP_H

#include <stdlib.h>

typedef struct {
    int n;          // 变量维度
    int m;          // 不等式约束数
    int p;          // 等式约束数
    double (*f)(double *x); // 目标函数
    void (*grad_f)(double *x, double *grad); // 目标函数梯度
    void (*g)(double *x, double *result); // 不等式约束
    void (*h)(double *x, double *result); // 等式约束
    void (*jac_g)(double *x, double *jac); // 不等式约束雅可比（一维数组）
    void (*jac_h)(double *x, double *jac); // 等式约束雅可比（一维数组）
} NLPProblem;

// 函数声明
double objective(double *x);
void gradient(double *x, double *grad);
void inequality_constraints(double *x, double *result);
void equality_constraints(double *x, double *result);
void jacobian_ineq(double *x, double *jac); // 修改为一维数组
void jacobian_eq(double *x, double *jac);   // 修改为一维数组

// 内存管理工具函数
double* allocate_vector(int size);
void free_vector(double *vec);

#endif